package fr.asip.cps3.exemple.vues.composants;

import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;

/**
 * Le <code>GridBagHelper</code> facilite l'utilisation de GridBagConstraints.<br>
 * Cette classe défini des styles réutilisables par différent composant dans une Grid.
 * 
 * Pour créer un layout faîtes ce qui suit:<br>
 * - Créer un <code>GridBagLayout</code> et un GridBagHelper</code>.<br>
 * - Préparer la taille des composants (min/prefered/max).<br>
 * - Créer un ou plusieurs style <code>StyleCellule</code>.<br>
 * - Ajouter les composants à la Grid en utilisant la méthode<code>GridBagHelper.ajoute</code>.<br>
 * <br>
 * Exemple:<br>
 * <code>
 *   GridBagLayout layout = new GridBagLayout();<br>
 *   panel.setLayout(layout);<br>
 *   GridBagHelper grid = new GridBagHelper(panel);<br>
 *   <br>
 *   StyleCellule style1 = new StyleCellule(1.0, 0.0,<br>
 *      GridBagConstraints.WEST, GridBagConstraints.VERTICAL, insets, 4, 0);<br>
 *   ...<br>
 *   grid.add(comp1, style1, 0, 0);<br>
 *   grid.add(comp2, style1, 0, 1);<br>
 *   grid.add(comp3, style2, 1, 0);<br>
 *   ..<br>
 * </code>
 */
public class GridBagHelper extends GridBagConstraints {
	
	private static final long serialVersionUID = 8624466142184953714L;
	
	/**
	 * Le container
	 */
    public Container container;

    /**
     * Ajoute une composant au container
     * Le composant occupe seulement une largeur et hauteur de cellule.
     * 
     * @param composant Composant à ajouter
     * @param style Style de la cellule
     * @param ligne Première cellule en Y
     * @param colonne Première cellule en X
     */
    public void ajoute(Component composant, StyleCellule style, int ligne, int colonne) {
        ajoute(composant, style, ligne, colonne, 1, 1);
    }

    /**
     * Ajoute une composant au container
     * 
     * @param composant Composant à ajouter
     * @param style Style de la cellule
     * @param ligne Première cellule en Y
     * @param colonne Première cellule en X
     * @param hauteurLigne Nombre de cellule dans une colonne (Utiliser GridBagConstraints.REMAINDER pour remplir toute les lignes jusqu'à la fin).
     * @param largeurColonne Nombre de cellule dans une ligne (Utiliser GridBagConstraints.REMAINDER pour remplir toute les colonnes jusqu'à la fin).
     */
    public void ajoute(Component composant, StyleCellule style, int ligne, int colonne, int hauteurLigne, int largeurColonne) {
        this.gridx = colonne;
        this.gridy = ligne;
        this.gridwidth = largeurColonne;
        this.gridheight = hauteurLigne;
        this.fill = style.fill;
        this.ipadx = style.ipadx;
        this.ipady = style.ipady;
        this.insets = style.insets;
        this.anchor = style.anchor;
        this.weightx = style.weightx;
        this.weighty = style.weighty;
        container.add(composant, this);
    }

    /**
     * Constructeur.
     * @param container Le container
     */
    public GridBagHelper(Container container) {
        super();
        this.container = container;
    }

}
